export  = FColorConverter;

/**
 *
 * @author 
 *
 */
class FColorConverter {
	public constructor() {
	}
	/* accepts parameters
    * h  Object = {h:x, s:y, v:z}
    * OR 
    * h, s, v
    * 
    * This code expects 0 <= h, s, v <= 1, if you're using degrees or radians, 
    * remember to divide them out.
    * The returned 0 <= r, g, b <= 255 are rounded to the nearest Integer.
    * If you don't want this behaviour remove the Math.rounds from the returned object. 
    * 
    * http://stackoverflow.com/questions/17242144/javascript-convert-hsb-hsv-color-to-rgb-accurately 
    */
    public static HSVtoRGB(h,s,v) {  
        var r,g,b,i,f,p,q,t;
        if(arguments.length===1) {
            s=h.s,v=h.v,h=h.h;
        }
        i=Math.floor(h*6);
        f=h*6-i;
        p=v*(1-s);
        q=v*(1-f*s);
        t=v*(1-(1-f)*s);
        switch(i%6) {
            case 0: r=v,g=t,b=p; break;
            case 1: r=q,g=v,b=p; break;
            case 2: r=p,g=v,b=t; break;
            case 3: r=p,g=q,b=v; break;
            case 4: r=t,g=p,b=v; break;
            case 5: r=v,g=p,b=q; break;
        }
        return {
            r: Math.round(r*255),
            g: Math.round(g*255),
            b: Math.round(b*255)
        };
    }
    /* accepts parameters
     * r  Object = {r:x, g:y, b:z}
     * OR 
     * r, g, b
     * This code will output 0 <= h, s, v <= 1, 
     *  but this time takes any 0 <= r, g, b <= 255 (does not need to be an integer)
     * 
     * http://stackoverflow.com/questions/17242144/javascript-convert-hsb-hsv-color-to-rgb-accurately
     * 
    */
    public static  RGBtoHSV(r,g,b) {
        if(arguments.length===1) {
            g=r.g,b=r.b,r=r.r;
        }
        var max=Math.max(r,g,b),min=Math.min(r,g,b),
            d=max-min,
            h,
            s=(max===0? 0:d/max),
            v=max/255;

        switch(max) {
            case min: h=0; break;
            case r: h=(g-b)+d*(g<b? 6:0); h/=6*d; break;
            case g: h=(b-r)+d*2; h/=6*d; break;
            case b: h=(r-g)+d*4; h/=6*d; break;
        }

        return {
            h: h,
            s: s,
            v: v
        };
    }
//SJG_MARK_APPEND--------------------


}//SJG_MARK_END-------------------------